package common

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io"
	"net/http"
	"net/url"
	"os/user"
	"runtime"
	"strings"
)

// SendHttp 发送 HTTP POST 请求，使用 JSON 格式传输数据。
func SendHttp[T any](url string, data any) (result *T, reserr error) {
	j, _ := json.Marshal(data)
	res, err := http.Post(url, "application/json", bytes.NewReader(j))
	if err != nil {
		return nil, err
	}
	tmp, err := io.ReadAll(res.Body)
	res.Body.Close()
	if err != nil {
		return nil, err
	}
	result = new(T)
	reserr = json.Unmarshal(tmp, result)
	return
}

// SendHttpByWWW 发送 HTTP POST 请求，使用 application/x-www-form-urlencoded 格式传输数据。
func SendHttpByWWW[T any](url string, data url.Values) (result *T, reserr error) {
	res, err := http.Post(url, "application/x-www-form-urlencoded", strings.NewReader(data.Encode()))
	if err != nil {
		return nil, err
	}
	tmp, err := io.ReadAll(res.Body)
	res.Body.Close()
	if err != nil {
		return nil, err
	}
	result = new(T)
	reserr = json.Unmarshal(tmp, result)
	return
}

// StackTrace 获取当前 goroutine 的调用栈信息。
func StackTrace() string {
	ret := "\n\t\t[StackTrace]:\n"
	for i := 1; i < 40; i++ {
		pc, file, line, ok := runtime.Caller(i)
		if !ok {
			break
		}
		ret = fmt.Sprintf("%s\t\t%d. %s() %s:%d\n", ret, i, runtime.FuncForPC(pc).Name(), file, line)
	}
	return ret
}

// GetSystemUserName 获取当前系统用户的用户名。
func GetSystemUserName() string {
	if us, err := user.Current(); err != nil {
		return ""
	} else {
		return us.Username
	}
}
